home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
comm
/
term
/
term_source.lha
/
Extras
/
Source
/
gtlayout-source.lha
/
LTP_NewMenu.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-03-18
|
4KB
|
195 lines
/*
** GadTools layout toolkit
**
** Copyright © 1993-1996 by Olaf `Olsen' Barthel
** Freely distributable.
**
** :ts=4
*/
#ifndef _GTLAYOUT_GLOBAL_H
#include "gtlayout_global.h"
#endif
#ifdef DO_MENUS
/* LTP_NewMenu():
*
* Create a new menu, based on the Screen and Font given.
*/
RootMenu *
LTP_NewMenu(struct Screen *Screen,struct TextAttr *TextAttr,struct Image *AmigaGlyph,struct Image *CheckGlyph,LONG *ErrorPtr)
{
LONG Error;
if(Screen)
{
APTR Pool;
// Wrap all the allocations into a pool
if(Pool = AsmCreatePool(MEMF_ANY | MEMF_PUBLIC | MEMF_CLEAR,1024,1024,SysBase))
{
struct RootMenu *Root;
// Create the root
if(Root = (struct RootMenu *)AsmAllocPooled(Pool,sizeof(struct RootMenu),SysBase))
{
Root->Pool = Pool;
if(TextAttr)
Root->TextAttr = TextAttr;
else
Root->TextAttr = Screen->Font;
// Open the menu font
if(Root->Font = OpenFont(Root->TextAttr))
{
// Get the drawing information
if(Root->DrawInfo = GetScreenDrawInfo(Screen))
{
// Fill in the dummy rastport
InitRastPort(&Root->RPort);
Root->RPort.BitMap = Screen->RastPort.BitMap;
SetFont(&Root->RPort,Root->Font);
// Get the text rendering pen
if(Root->DrawInfo->dri_Version < 2)
Root->TextPen = Root->DrawInfo->dri_Pens[DETAILPEN];
else
Root->TextPen = Root->DrawInfo->dri_Pens[BARDETAILPEN];
// Something to remember
Root->Screen = Screen;
// Let's hope it won't grow in the future
CopyMem(Root->TextAttr,&Root->BoldAttr,sizeof(struct TTextAttr));
// Make it boldface
Root->BoldAttr.tta_Style |= FSF_BOLD;
// Initialize the lists
NewList((struct List *)&Root->MenuList);
NewList((struct List *)&Root->ItemList);
// Get the glyph widths
if(CheckGlyph)
{
GetAttr(IA_Width, CheckGlyph,&Root->CheckWidth);
GetAttr(IA_Height, CheckGlyph,&Root->CheckHeight);
}
else
{
// No glyph is provided, use the default values
if(V39)
{
struct Image *Glyph;
if(Glyph = NewObject(NULL,SYSICLASS,
SYSIA_DrawInfo, Root->DrawInfo,
SYSIA_Which, MENUCHECK,
SYSIA_ReferenceFont, Root->Font,
TAG_DONE))
{
GetAttr(IA_Width, Glyph,&Root->CheckWidth);
GetAttr(IA_Height, Glyph,&Root->CheckHeight);
DisposeObject(Glyph);
}
}
if(!Root->CheckWidth)
Root->CheckWidth = 15;
if(!Root->CheckHeight)
Root->CheckHeight = 8;
}
if(AmigaGlyph)
{
GetAttr(IA_Width, AmigaGlyph,&Root->AmigaWidth);
GetAttr(IA_Height, AmigaGlyph,&Root->AmigaHeight);
}
else
{
// No glyph is provided, use the default values
if(V39)
{
struct Image *Glyph;
if(Glyph = NewObject(NULL,SYSICLASS,
SYSIA_DrawInfo, Root->DrawInfo,
SYSIA_Which, AMIGAKEY,
SYSIA_ReferenceFont, Root->Font,
TAG_DONE))
{
GetAttr(IA_Width, Glyph,&Root->AmigaWidth);
GetAttr(IA_Height, Glyph,&Root->AmigaHeight);
DisposeObject(Glyph);
}
}
if(!Root->AmigaWidth)
Root->AmigaWidth = 23;
if(!Root->AmigaHeight)
Root->AmigaHeight = 8;
}
// Establish default menu item height
Root->ItemHeight = Root->RPort.TxHeight;
if(Root->CheckHeight > Root->ItemHeight)
Root->ItemHeight = Root->CheckHeight;
if(Root->AmigaHeight > Root->ItemHeight)
Root->ItemHeight = Root->AmigaHeight;
Root->ItemHeight += 2;
return(Root);
}
else
Error = ERROR_NO_FREE_STORE;
CloseFont(Root->Font);
}
else
Error = ERROR_OBJECT_NOT_FOUND;
}
else
Error = ERROR_NO_FREE_STORE;
AsmDeletePool(Pool,SysBase);
}
else
Error = ERROR_NO_FREE_STORE;
}
else
Error = ERROR_REQUIRED_ARG_MISSING;
if(ErrorPtr)
*ErrorPtr = Error;
return(NULL);
}
#endif /* DO_MENUS */